2018年12月20日

本日の内容(案)

  1. なぜPythonでなくRを使うのか?
  2. Reproducible Research
  3. Tidy Data
  4. Data Science Workflow
    • Program
    • Import
    • Tidy/Transform
    • Visualize
    • Communicate
  5. おまけ

 

振り返り

なぜPythonでなくRを使うのか?

Six Reasons To Learn R For Business, R Blogger

  1. R Has The Best Overall Qualities
  2. R Is Data Science For Non-Computer Scientists
  3. Learning R Is Easy With The Tidyverse
  4. R Has Brains, Muscle, And Heart
    • Cutting-edge algorithms and Powerful tools (packages)
  5. R Is Built For Business
    • R Markdown
  6. R Community Support

Reproducible Research

  • データから分析結果が再現できること
  • 同じデータから同じ結果が得られることは科学的知見の蓄積において重要
  • 過去の分析を見直した時に何をやっているか理解できることも重要
    • その場限りの分析では知見の蓄積にならない
  • 文書化(記録)されない手作業(データ整形、コピペなど)が再現性を阻害する
    • 人の記憶は絶対じゃない、手作業では間違いが混入しやすい

Tidy Data

乱暴に言うと「Coddの第三正規形」を満たすデータ(対義語はMessy Data)。

  • Each variable forms a column.
  • Each observation forms a row.
  • Each type of observational unit forms a table.
  • Each value is a cell.

日本語では以下となり、構造と意味が一致しているデータをTidy Dataと呼びます。

  • 個々の変数が1つの列をなす
  • 個々の観測が1つの行をなす
  • 個々の観測の構成単位の類型が1つの表をなす
  • 個々の値が1つのセルをなす

Data Science Workflow

Program

開発環境

  • Rを使うのであればIDEとしてRStudioを使うのがベスト
    • RやR Markdownのコーディングに最適化
    • プロジェクト単位でのファイル・パッケージ管理が可能
    • 充実したヘルプやトレース機能
    • Git/SVNなどのVCSとの連携によるソース管理
  • 日本語環境を快適に使うにはWinodwsは非推奨
    • OS自体がいまだにSJIS(CP932)を利用しているので日本語処理に難がある
      • 日本語があると正しく処理できないケースが増えている
      • Windows環境ならDockerでRStudio Serverを動かす方がベターだが…
      • 近いうちにUTF-8ベースになる予定はあるが…
    • mac OS または linux(Ubuntu)などUTF-8ベースのOSでの利用を推奨
      • ストレスフリーに近い

RStuido Tips

RStudioを利用する場合はR MarkdownのR Notebook機能を活用すると実行結果を確認するためにknitする必要がなく分析が早く分かりやすくなります。

  • R Notebook機能 - chunkの下に実行結果を表示する機能

R Notebook機能を上手に活用するには[Ctrl + Enter]と[Ctrl + Shift + Enter]のショートカットキーを利用します。

  • [Ctrl + Enter] - カーソルがある部分、または、選択部分を実行する
  • [Ctrl + Shift + Enter] - カーソルがあるchunk全体を実行する

コードがパイプでつながっている場合は、[Ctrl + Enter]でも一連のコードを実行してくれます。また、ライブラリ読み込みなど共通処理はsetupchunkに記載すると便利です。

setup chunkの例

\```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)

require(DT)
require(dygraphs)
require(plotly)
require(tidyverse)    # tidyverseは最後に読み込むとコンフリクトが分かりやすい
\```

 
実際に記述する際は先頭の\は記述しないでください。

オープンソース

Rに限らず分析を行う場合にはVSCなどのオープンソース関連の知識も必要になってきています。

  • SVN関連は必須
    • GitHub, GitLab, BitBucketなどのクラウドサービス
    • Git自体 or Git Client
  • SNS以外で情報発信をしたい場合
    • ホスティングサービス
      • 静的ホスティングサービス(GitHub Pages、Netlifyなど)
      • AWSなども使えるようになればベター
    • 静的サイトジェネレーター
      • hugoなど

Import

データストア

  • データストアに対してはSQLアクセスが利用できるのがベスト
    • SQLアクセスが利用できない場合はAPIアクセス
    • APIアクセスが利用できない場合はスクレイピング
    • スクレイピングが利用できない場合はファイル入力
  • データストアにファイルを使う必要があるならバージョン管理ができる形式がベター
    • 必ずソースと共にVCSで管理する(再現可能性を低下させない)
    • ファイルから読み込んだデータをSQLiteのようなサーバレスDBMSで管理する手もある
      • こちらはなれないと難しいが、データを追加していく際に便利

Importあれこれ

Tidy/Transform

データハンドリング

データハンドリングは「記録」を分析できるデータにするために必要な前処理で大きく以下に分類できます。

  1. データクレンジング
    • データの中身を整えてデータの品質を上げる
      • 揺れやゴミ、重複データを取り除く、データを補完する
      • 任意の型に変換するなど
        • 正規表現が役に立ちます
  2. 整形処理
    • データの形を整えてコンピュータで処理できるようにする
      • 雑然データを整然データに変形する
      • 整然データを処理する(削除・抽出・要約・計算・集計など)
        • tidyverseの出番です

Dataset

iris

tidyr::gather

tidyr::gather関数は、keyに変数名をvalueにその値をまとめます。

iris %>% tidyr::gather(key = "Part", value = "Value", -Species) %>% head()

tidyr::spread

tidyr::spread関数はkeyを変数名にvalueをその値として展開しますが、行識別のためにユニークな値が必要です。

iris %>% tibble::rowid_to_column("id") %>% 
  tidyr::gather(key = "Part", value = "Value", -id, -Species) %>% 
  tidyr::spread(key = Part, value = Value) %>% dplyr::select(-id) %>% head()

表示順を変えたい(forcats)

iris %>% ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Width)) +
    ggplot2::geom_boxplot(ggplot2::aes(colour = Species))

中央値順に並べ替える(forcats)

iris %>% dplyr::mutate(Species = forcats::fct_reorder(Species, Sepal.Width)) %>%
  ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Width)) +
    ggplot2::geom_boxplot(ggplot2::aes(colour = Species))

purrrは何ができるのか?

purrr::map関数は指定した引数に対して指定した処理(関数、演算子など)を適用する関数で繰り返し処理に威力を発揮します。例えば、

  • 多数のファイルを読込んで結合する
file_path %>% list.files(path = ., pattern = "(issues_)", full.names = TRUE) %>% 
  purrr::map_df(.x = ., .f = readr::read_csv, locale = readr::locale(encoding = "cp932"))
  • 因子水準ごとに処理を適用する
iris %>% split(.$Species) %>% 
  purrr::map_df(~ lm(Sepal.Length ~ Sepal.Width, data = .x) %>% broom::tidy(),
                .id = "Species")
  • データフレーム内のリストを処理する(第6回で実施)

purrr::map

第6回で説明したpurrr::map_df関数を使った カスタムフィールドの展開

with(issues, purrr::map_df(.x = custom_fields, .f = function(.x) {c(.x)}))

以下の処理と等価です(なお、c関数がなくても結果は同じです)。

dplyr::bind_rows(
  c(list(id = 2L, name = "Resolution", value = "Invalid")),
  c(list(id = 4L, name = "Affected version")) )

purrr::map2

第6回で説明したpurrr::map2_df関数を使った カスタムフィールドの展開

with(issues, purrr::map2_df(.x = id, .y = custom_fields,
                            .f = function(.x, .y) {c(issue_id = .x, .y)}))

以下の処理と等価です。

dplyr::bind_rows(
  c(issue_id = 16451L, list(id = 2L, name = "Resolution", value = "Invalid")),
  c(issue_id = 16451L, list(id = 4L, name = "Affected version")) )

Tidy/Transformあれこれ

Visualize

ggplot2::aesの中か外か?

iris %>% ggplot2::ggplot(ggplot2::aes(x = Species, fill = Species)) + 
  ggplot2::geom_boxplot(ggplot2::aes(y = Sepal.Length), alpha = 0.5)

ggplot2::aesの中か外か?

iris %>% ggplot2::ggplot(ggplot2::aes(x = Species, fill = Species)) + 
  ggplot2::geom_boxplot(ggplot2::aes(y = Sepal.Length, alpha = 0.5))

サイズやシンボル(シェイプ)を変える

iris %>% ggplot2::ggplot(ggplot2::aes(x = Petal.Width, y = Petal.Length)) + 
  ggplot2::geom_point(ggplot2::aes(colour = Species, size = Sepal.Length, shape = Species))

flexdashborad

flexdashboradの区切りはMarkdownのHeader記述(###)で代用できます。幅は合計が1,000になるようにするといい塩梅です。メニューは#レベルを記述すれば自動的にメニューとなり、タブはカラムやローのレベル(##)で明示的に指定する必要があります。 テンプレート例

# Menu (Tab)

## Coloumn Left {data-width=650}

### Component

## Coloumn Rigth {data-width=350} {.tabset}

### Tab 1

### Tab 2

htmlwidgets

htmlwidgets はHTMLドキュメントでJavaScriptを用いてインタラクティブな表示を提供するためのベースとなるパッケージです。htmlwidgetsパッケージを利用した様々なパッケージが公開されています。代表的なパッケージには以下のようなものがあります。

package description
DT DataTablesライブラリを用いたテーブル(表)表示
plotly ggplot2オブジェクトを簡単にインタラクティブ化
dygraphs dygraphsライブライを用いた時系列グラフに特化したパッケージ

Package DT

mtcars %>% DT::datatable(options = list(pageLength = 5))

 

Package plotly

(iris %>% ggplot2::ggplot(ggplot2::aes(x = Petal.Width, y = Petal.Length)) +
           ggplot2::geom_point(ggplot2::aes(colour = Species))) %>% plotly::ggplotly()

Packages dygraphs

xts::as.xts(nhtemp) %>% dygraphs::dygraph(main = "New Haven Temperatures") %>% 
  dygraphs::dyRangeSelector()

ggplot2あれこれ

Communicate

R Markdown

  • Rのコードや実行結果を文書に埋め込めるMarkdown記法
  • 実行結果を直接レポートにできる仕組みは他言語には(ほぼ)ない
    • 例外:Jupyter Notebook(旧 IPython Notebook)
      • これに触発されたのがR Notebook機能と思われる
  • Markdownとは?
    • プレーンテキストで体裁のある文書を作成するための記法
    • シンプル&ライトウェイト、テキストなのでVCSで管理可能
    • 変換ソフト(pandocなど)の利用で多種多様なフォーマットに変換可能
  • シンプルな記述
    • YAML(体裁、出力フォーマットを指定する箇所)
    • (Code) Chunk(実行させたいコードを記述する箇所)
    • Text (Markdown)(コード以外の文書を記述する箇所)

R Markdown Website & blogdown

  • R Markdownを利用して静的サイトを生成する静的サイトジェネレーター
    • R Markdownによる記述
    • knit結果を公開すればWebサイトやblogサイトが簡単に構築できる

 

  • R Markdown website
    • R MarkdownのHTML出力にメニューを付加するイメージ
    • Bootswatchを用いたテーマ設定が可能
  • blogdown
    • 静的サイトジェネレーター(hugo)のラッパーとR Studio Addins
    • websiteより洗練されたデザインテンプレートが多数

おわりに

復習のためのリソース

  • 2018年度勉強会
    • 今年度の勉強会の資料は全てこちらで公開しています
    • ソースなどはGitHubからクローン可能です
  • Project Cabinet
    • 環境構築(除くmac OS)と基本説明はこちらから
  • Project Cabinet Blog
    • 上記以外の関数の使い方やTipsなどを紹介しています
  • r-wakalang
    • エキスパートの揃ったSlack Community

Enjoy !

CC BY-NC-SA 4.0, Sampo Suzuki